﻿using CLM.Gestao.Administrador.DAL;
using CLM.Gestao.Importacao;
using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;

namespace CLM.Gestao.Administrador.BLL
{
    /// <summary>
    /// 
    /// </summary>
    public class CentroCustoProdutoAtivo : CentroCustoProdutoAtivoBLO<TB_CENTRO_CUSTO_PRODUTO_ATIVO>
    {
        #region Conversões

        /// <summary>
        /// Converte uma lista de objetos do tipo Lista para uma lista de objetos do tipo correspondente no EDM
        /// </summary>
        /// <param name="pLista"></Lista></param>
        /// <returns></returns>
        private List<TB_CENTRO_CUSTO_PRODUTO_ATIVO> ConvertToEDM(List<Lista> pLista)
        {
            List<TB_CENTRO_CUSTO_PRODUTO_ATIVO> List = (from l in pLista
                                                        select new TB_CENTRO_CUSTO_PRODUTO_ATIVO
                                                {
                                                     ID_CENTRO_CUSTO = l.IdCentroCusto,
                                                     ID_PRODUTO_FAMILIA = l.idProdutoFamilia,
                                                     ID_UNIDADE_NEGOCIO = l.IdUnidadeNegocio,
                                                     INDICA_ATIVO = true,
                                                     INDICA_FAMILIA_PRODUTO = l.IndicaFamiliaProduto,
                                                     INDICA_TODOS_PRODUTOS = l.IndicaTodosProdutos,
                                                     INDICA_UNIDADE_NEGOCIO = l.IndicaUnidadeNegocio,
                                                     ID_CENTRO_CUSTO_PRODUTO_ATIVO = l.IdCentroCustoProdutoAtivo
                                                }).ToList();
            return List;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pContext"></param>
        /// <returns></returns>
        private List<Lista> ConvertToContext(IQueryable<TB_CENTRO_CUSTO_PRODUTO_ATIVO> pContext)
        {
            List<Lista> List = (from l in pContext
                                select new Lista
                                {
                                    IdCentroCusto = l.ID_CENTRO_CUSTO,
                                    idProdutoFamilia = l.ID_PRODUTO_FAMILIA,
                                    NomeProdutoFamilia = l.TB_PRODUTO_FAMILIA.NOME_PRODUTO_FAMILIA,
                                    IdUnidadeNegocio = l.ID_UNIDADE_NEGOCIO,
                                    NomeUnidadeNegocio = l.TB_UNIDADE_NEGOCIO.NOME_UNIDADE_NEGOCIO,
                                    IndicaFamiliaProduto = l.INDICA_FAMILIA_PRODUTO,
                                    IndicaTodosProdutos = l.INDICA_TODOS_PRODUTOS,
                                    IndicaUnidadeNegocio = l.INDICA_UNIDADE_NEGOCIO,
                                    IdCentroCustoProdutoAtivo = l.ID_CENTRO_CUSTO_PRODUTO_ATIVO,
                                    IndicaAtivo = l.INDICA_ATIVO
                                }).ToList();
            return List;
        }

        #endregion Conversões

        #region CRUD

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pLista"></param>
        public void Add(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Add(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pLista"></param>
        public void Delete(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Delete(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pLista"></param>
        public void Update(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Update(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Efetua a pesquisa na tabela, filtrando as solicitações do usuário
        /// </summary>
        /// <param name="pPesquisa">pPesquisa</param>
        /// <returns>Lista</returns>
        private IQueryable<TB_CENTRO_CUSTO_PRODUTO_ATIVO> Get(Lista pPesquisa)
        {
            IQueryable<TB_CENTRO_CUSTO_PRODUTO_ATIVO> Consulta;

            Consulta = from p in GetAll()
                       select p;

            if (pPesquisa != null)
            {
                if(pPesquisa.IdCentroCusto != null)
                    Consulta = from p in Consulta where p.ID_CENTRO_CUSTO == pPesquisa.IdCentroCusto select p;

                if (pPesquisa.idProdutoFamilia != null)
                    Consulta = from p in Consulta where p.ID_PRODUTO_FAMILIA == pPesquisa.idProdutoFamilia select p;

                if (pPesquisa.IdUnidadeNegocio != null)
                    Consulta = from p in Consulta where p.ID_UNIDADE_NEGOCIO == pPesquisa.IdUnidadeNegocio select p;

                if (pPesquisa.IndicaAtivo != null)
                    Consulta = from p in Consulta where p.INDICA_ATIVO == pPesquisa.IndicaAtivo select p;

            }
            return Consulta;
        }

        #endregion CRUD

        #region Retorna Listas e Itens

        public List<Lista> GetLista()
        {
            return GetLista(new Lista());
        }

        public List<Lista> GetLista(Lista pPesquisa)
        {
            var ListaUsuario = ConvertToContext(Get(pPesquisa));
            return ListaUsuario;
        }

        #endregion Retorna Listas e Itens

        #region Consultas

        #endregion Consultas

        #region Processos

        #endregion

        #region Classes

        /// <summary>
        /// Classe utilizada para preenchimento de Combos
        /// </summary>
        public class Lista
        {
            public int IdCentroCustoProdutoAtivo { get; set; }
            public int? IdCentroCusto { get; set; }
            public int? idProdutoFamilia { get; set; }
            public string NomeProdutoFamilia { get; set; }
            public int? IdUnidadeNegocio { get; set; }
            public string NomeUnidadeNegocio { get; set; }
            public bool? IndicaTodosProdutos { get; set; }
            public bool? IndicaFamiliaProduto { get; set; }
            public bool? IndicaUnidadeNegocio { get; set; }
            public bool? IndicaAtivo { get; set; }
        }

        #endregion Classes

    }

    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class CentroCustoProdutoAtivoBLO<T> : IBLO<T> where T : TB_CENTRO_CUSTO_PRODUTO_ATIVO
    {
        /// <summary>
        /// 
        /// </summary>
        private CentroCustoProdutoAtivoDAO<T> _base = new CentroCustoProdutoAtivoDAO<T>();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Add(T pEntity)
        {
            Validate(pEntity);
            _base.Add(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Save(T pEntity)
        {
            Validate(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        public void Delete(T pEntity)
        {
            _base.Delete(pEntity);
            _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Update(T pEntity)
        {
            Validate(pEntity);
            _base.Update(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IQueryable<T> GetAll()
        {
            return _base.GetAll();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        public void Validate(T pEntity)
        {

        }
    }
}